package eu.catengine.primitive;

import android.graphics.PointF;

/**
 * Klasa przechowująca punkt na płaszczyźnie utworzony z dwóch liczb zmiennoprzecinkowych (x, y).
 * 
 * @author mbienkowski
 */
public class Point extends PointF
{
    /**
     * Konstruktor domyślny. Ustawia współrzędne na 0.0f.
     */
    public Point()
    {
	x = y = 0;
    }

    /**
     * Konstruktor kopiujący.
     * 
     * @param point
     *            <code>Point</code> obiekt do skopiowania.
     */
    public Point(Point point)
    {
	this.x = point.x;
	this.y = point.y;
    }

    /**
     * Konstruktor tworzący punkt o podanych współrzędnych x oraz y.
     */
    public Point(float x, float y)
    {
	this.x = x;
	this.y = y;
    }

    /**
     * Do obecnych wspołrzędnych punktu dodaje współrzędne punktu podanego jako
     * parametr.
     * 
     * @return <code>Point</code> zwraca referencję na obiekt po wykonanym działaniu.
     */
    public Point add(Point point)
    {
	this.x += point.x;
	this.y += point.y;

	return this;
    }

    /**
     * Do obecnych wspołrzędnych punktu dodaje współrzędne podane jako parametr.
     * 
     * @return <code>Point</code> Zwraca referencję na obiekt po wykonanym działaniu.
     */
    public Point add(float x, float y)
    {
	this.x += x;
	this.y += y;

	return this;
    }

    /**
     * Od obecnych wspołrzędnych punktu odejmuje współrzędne punktu podanego
     * jako parametr.
     * 
     * @return <code>Point</code> Zwraca referencję na obiekt po wykonanym działaniu.
     */
    public Point subtract(Point point)
    {
	this.x -= point.x;
	this.y -= point.y;

	return this;
    }

    /**
     * Od obecnych wspołrzędnych punktu odejmuje współrzędne podane jako
     * parametr.
     * 
     * @return <code>Point</code> Zwraca referencję na obiekt po wykonanym działaniu.
     */
    public Point subtract(float x, float y)
    {
	this.x -= x;
	this.y -= y;

	return this;
    }

    /**
     * Mnoży obecne współrzędne punktu przez poszczegółne współrzędne punktu
     * podanego jako parametr.
     */
    public void multiply(Point point)
    {
	this.x *= point.x;
	this.y *= point.y;
    }

    /**
     * Mnoży obecne współrzędne punktu przez współrzędne podane jako parametr.
     */
    public void multiply(float x, float y)
    {
	this.x *= x;
	this.y *= y;
    }

    /**
     * Mnoży obecne współrzędne punktu przez skalar podany jako parametr.
     */
    public void multiply(float scalar)
    {
	this.x *= scalar;
	this.y *= scalar;
    }

    /**
     * Dzieli obecne współrzędne punktu przez współrzędne punktu podanego jako
     * parametr.
     */
    public void divide(Point point)
    {
	this.x /= point.x;
	this.y /= point.y;
    }

    /**
     * Dzieli obecne współrzędne punktu przez współrzędne podane jako parametr.
     */
    public void divide(float x, float y)
    {
	this.x /= x;
	this.y /= y;
    }

    /**
     * Dzieli obecne współrzędne punktu przez skalar podany jako parametr.
     */
    public void divide(float scalar)
    {
	this.x /= scalar;
	this.y /= scalar;
    }

    /**
     * Zwraca odleglosc miedzy wspolrzednymi obecnego punktu w stosunku do
     * punktu podanego jako parametr.
     */
    public float distance(Point p)
    {
	return (float) Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));
    }

    /**
     * Przypisuje wartość współrzędnej X.
     */
    public void setX(float x)
    {
	this.x = x;
    }

    /**
     * Przypisuje wartość współrzędnej Y.
     */
    public void setY(float y)
    {
	this.y = y;
    }

    /**
     * Zwraca obiekt w formie tekstu stworzonego na podstawie przechowywanych danych.
     */
    @Override
    public String toString()
    {
	return "PointXY(" + x + ", " + y + ")";
    }
}
